Day 1:

環境構築

まずは演習環境を整えます.

ここでは二つの拡張パッケージ,「RCurl」「ggplot2」をインストールします.

RCurl( https://cran.r-project.org/web/packages/RCurl/index.html ) は R に HTTP クライアント機能を追加する拡張パッケージです. R から直接ウェブページと取得する等の操作が可能となります.

ggplot2( http://ggplot2.org/ ) はグラフ描画機能を強化する拡張パッケージです. カラフルなグラフを比較的容易に描くことができます.

それでは早速インストールしてみましょう.

RCurlパッケージのインストール

以下のコマンドで拡張パッケージをインストールします.

install.packages("RCurl")

「install.packages」は拡張パッケージをインストールするための関数です.指定した名前の拡張パッケージをCRANから探し出してインストールします.

「RCurl」パッケージを読み込みます.

library(RCurl)

拡張パッケージの読み込みはRセッション毎に必要です.

以上で「RCurl」のインストールは完了です.

なお,拡張パッケージのインストールと読み込みを実行するスクリプトは以下のとおりです.

if(!require(RCurl)){ # 拡張パッケージはインストールされているか?
  # 拡張パッケージのインストール
  install.packages("RCurl")
  # 拡張パッケージの読み込み
  library(RCurl)
}
## Loading required package: RCurl
## Loading required package: bitops

ggplot2パッケージのインストール

以下のコマンドで拡張パッケージをインストールします.

install.packages("ggplot2")

「ggplot2」パッケージを読み込みます.

library(ggplot2)

以上で「ggplot2」のインストールは完了です.

なお,拡張パッケージのインストールと読み込みを実行するスクリプトは以下のとおりです.

if(!require(ggplot2)){ # 拡張パッケージはインストールされているか?
  # 拡張パッケージのインストール
  install.packages("ggplot2")
  # 拡張パッケージの読み込み
  library(ggplot2)
}
## Loading required package: ggplot2

はじめてのオープンデータ処理

使用するデータについて

今回は「HEALTH.DATA.NY.GOV」で公開されている Baby Names: Beginning 2007 というデータセットを使います.

このデータセットはニューヨーク州で出生した赤ちゃんの名前の統計データです.2007年から2013年までの郡ごとに集められたデータが収録されています.

ニューヨーク州の郡,New York Counties by André Koehne and DEIDATVM,https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/New_York_Counties.svg/500px-New_York_Counties.svg.png

ニューヨーク州の郡,New York Counties by André Koehne and DEIDATVM,https://upload.wikimedia.org/wikipedia/commons/thumb/d/db/New_York_Counties.svg/500px-New_York_Counties.svg.png

HEALTH.DATA.NY.GOV でも加工したり,グラフを描いたりすることができます(最近はこうしたサイトが増えています).

Baby Names: Beginning 2007

Baby Names: Beginning 2007

データの読み込み

それでは早速Rにオープンデータを読み込んでみましょう.

URL「 https://health.data.ny.gov/api/views/jxy9-yhdk/rows.csv?accessType=DOWNLOAD 」から直接データを読み込みます.

#URLからのデータ読み込み
tmp <- getURL(url="https://health.data.ny.gov/api/views/jxy9-yhdk/rows.csv?accessType=DOWNLOAD",ssl.verifypeer = FALSE)

読み込み結果がオブジェクト「tmp」に代入されます.

読み込んだ内容を表示してみましょう.

head(tmp)

ズラッとデータが表示されます.

解説

「getURL」はRCurlパッケージに含まれる関数です.指定したURLからファイルをダウンロードする機能を有します.

オプション「ssl.verifypeer=FALSE」はSSL証明書の検証手順を省略するためのオプションです.

文字コードを指定する場合は「.encoding」オプションを指定します. データ読み込み時に文字化けが発生する場合などに用います.

例えば,ダウンロードするファイルの文字コードが Shift-JIS とわかっている場合は以下のように getURL を呼び出します.

# Shift-JIS(CP932)をダウンロードする
tmp<-getURL("http://www.tepco.co.jp/forecast/html/images/juyo-j.csv",.encoding="cp932",.mapUnicode = FALSE)

読み込んだ文字コードを別の文字コードに変換する場合は iconv を使います.

# Shift-JIS(CP932)からUTF8に変換する.
tmp2<-iconv(tmp,from="cp932",to="utf8")

head はデータの先頭を表示する関数です.

head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

詳しい使い方についてはヘルプ,ウェブリソースを参照してください.

ヘルプは help コマンドで呼び出せます.

help(getURL)

または

?getURL

データフレーム(data.frame)への変換

data.frame は表形式のデータ構造です.「習うよりは慣れろ」のポリシーで 先程読み込んだオープンデータを data.frame に変換してみましょう.

#CSV形式での読み込み
data <- read.csv(text=tmp)

解説

「read.csv」はデフォルトパッケージに含まれる関数で CSV ファイルや文字列を data.frame として読み込む機能を有します.

ちなみにファイルからデータを読み込む場合には以下のように指定します.

#CSVファイルの読み込み
data <- read.csv(file="day01/Baby_Names__Beginning_2007.csv")

データの確認

つぎに data.frame 変換後のデータ内容を確認してみましょう.

まずはデータの先頭行を確認します.

#データの確認(先頭数行のみ)
head(data)
##   Year First.Name County Sex Count
## 1 2013      DAVID  KINGS   M   272
## 2 2013     JAYDEN  KINGS   M   268
## 3 2013     JAYDEN QUEENS   M   219
## 4 2013      MOSHE  KINGS   M   219
## 5 2013      ETHAN QUEENS   M   216
## 6 2013     SOPHIA QUEENS   F   204

データの構造を表示します.

str(data)
## 'data.frame':    43890 obs. of  5 variables:
##  $ Year      : int  2013 2013 2013 2013 2013 2013 2013 2013 2013 2013 ...
##  $ First.Name: Factor w/ 1638 levels "AADEN","AALIYAH",..: 424 780 780 1194 546 1469 410 720 544 546 ...
##  $ County    : Factor w/ 61 levels "ALBANY","ALLEGANY",..: 23 23 40 23 40 40 40 23 23 23 ...
##  $ Sex       : Factor w/ 2 levels "F","M": 2 2 2 2 2 1 2 2 1 2 ...
##  $ Count     : int  272 268 219 219 216 204 203 202 196 196 ...

データの要約を確認します.

#データの概要
summary(data)
##       Year         First.Name            County      Sex      
##  Min.   :2007   EMMA    :  284   KINGS      : 4957   F:20509  
##  1st Qu.:2008   JACOB   :  284   SUFFOLK    : 4005   M:23381  
##  Median :2010   LOGAN   :  270   NASSAU     : 3548            
##  Mean   :2010   OLIVIA  :  268   QUEENS     : 3376            
##  3rd Qu.:2012   ISABELLA:  259   WESTCHESTER: 2941            
##  Max.   :2013   SOPHIA  :  249   ERIE       : 2557            
##                 (Other) :42276   (Other)    :22506            
##      Count       
##  Min.   :  5.00  
##  1st Qu.:  7.00  
##  Median : 11.00  
##  Mean   : 18.62  
##  3rd Qu.: 20.00  
##  Max.   :297.00  
## 

データの行・列サイズを確認します.

#行・列サイズの確認
dim(data)
## [1] 43890     5

列名を確認してみましょう.

#オープンデータの列名確認
colnames(data)
## [1] "Year"       "First.Name" "County"     "Sex"        "Count"

行名を表示する rownames もあります.

data.frame のアクセス手法は色々とあります.

たとえば,添字を使って1行目を取り出すには以下のようにします.

data[1,]
##   Year First.Name County Sex Count
## 1 2013      DAVID  KINGS   M   272

2行目を取り出すには,

data[2,]
##   Year First.Name County Sex Count
## 2 2013     JAYDEN  KINGS   M   268

1〜5行目を取り出すには,

data[1:5,]
##   Year First.Name County Sex Count
## 1 2013      DAVID  KINGS   M   272
## 2 2013     JAYDEN  KINGS   M   268
## 3 2013     JAYDEN QUEENS   M   219
## 4 2013      MOSHE  KINGS   M   219
## 5 2013      ETHAN QUEENS   M   216

1,3,5行目を取り出すには,

data[c(1,3,5),]
##   Year First.Name County Sex Count
## 1 2013      DAVID  KINGS   M   272
## 3 2013     JAYDEN QUEENS   M   219
## 5 2013      ETHAN QUEENS   M   216

とします.

最終行から10行を取り出すには, 行数を求める nrow 関数を用いて以下のようにします.

#data.frameの行数を求める
x<-nrow(data)
data[(x-10):x,]
##       Year First.Name      County Sex Count
## 43880 2007    ZACHARY    CHENANGO   M     5
## 43881 2007    ZACHARY      OSWEGO   M     5
## 43882 2007    ZACHARY  RENSSELAER   M     5
## 43883 2007    ZACHARY ST LAWRENCE   M     5
## 43884 2007    ZACHARY      ULSTER   M     5
## 43885 2007    ZACHARY  WASHINGTON   M     5
## 43886 2007    ZACHARY       WAYNE   M     5
## 43887 2007    ZACKARY        ERIE   M     5
## 43888 2007      ZISSY    ROCKLAND   F     5
## 43889 2007        ZOE      ALBANY   F     5
## 43890 2007        ZOE      ULSTER   F     5

列も同じように添字を指定して取り出すことができます.大量のデータが表示されるので head で絞っています.

head(data[,1])
## [1] 2013 2013 2013 2013 2013 2013

ただ,data.frameの場合,列名が付けられていることが殆どであるため, 通常は列名をつかって値を取り出します.

head(data$Year)
## [1] 2013 2013 2013 2013 2013 2013

data.frame の操作方法がなんとなく理解できたでしょうか.

data.frameは頻繁に登場するデータ構造となるので理解を深めておいてください.

簡単な集計

データについてはsummary関数である程度把握できたかと思いますが,もう少し細かくデータを見ていきましょう.

データについて性別の内訳を確認してみます.

table(data$Sex)
## 
##     F     M 
## 20509 23381

table はデフォルトパッケージに含まれるクロス集計機能を有する関数です.

つぎに調査年毎のデータ数を確認してみます.

table(data$Year)
## 
## 2007 2008 2009 2010 2011 2012 2013 
## 6367 6481 6312 6192 6216 6164 6158

調査年毎の性別の内訳を確認してみます.

#クロス集計(性別・年毎)
table(data$Sex,data$Year)
##    
##     2007 2008 2009 2010 2011 2012 2013
##   F 3002 3039 2917 2925 2918 2872 2836
##   M 3365 3442 3395 3267 3298 3292 3322

table 関数を用いると,data.frameの集計が手軽にできます.

グラフの描画

クロス集計結果をグラフにしてみましょう.グラフの作成にはggplotパッケージを用います.

性別毎の集計結果を棒グラフにします.x軸は性別,y軸は集計結果とします.

table(data$Sex)
## 
##     F     M 
## 20509 23381
#クロス集計結果をデータフレームに変換
tbl <- data.frame(table(data$Sex))
#確認
tbl
##   Var1  Freq
## 1    F 20509
## 2    M 23381
#列名の設定
names(tbl) <- c("Sex","Total")
#確認
tbl
##   Sex Total
## 1   F 20509
## 2   M 23381
#各列の確認
tbl$Sex
## [1] F M
## Levels: F M
tbl$Total
## [1] 20509 23381
#棒グラフの描画(x軸は性別,y軸は集計結果)
ggplot(data = tbl,mapping = aes(x=Sex,y=Total))+geom_bar(stat="identity")

練習問題

調査年(Year)毎の集計グラフを描画してみよう

ヒント:調査年毎の集計表はtable(data$Year)で作れます.

郡(County)毎の集計グラフを描画してみよう

ヒント:郡(County)毎の集計表はtable(data$County)で作れます.

ステップアップ

x軸ラベルの回転

theme関数のaxis.text.xオプションを使ってX軸ラベルを回転させます.

#クロス集計結果をデータフレームに変換
tbl <- data.frame(table(data$County))
#列名の設定
names(tbl) <- c("County","Total")
#グラフの描画
ggplot(tbl,aes(x=County,y=Total))+geom_bar(stat="identity")+theme(axis.text.x = element_text(angle = 90, hjust = 1))

積み上げ棒グラフの作成

tbl<-data.frame(table(data$Sex,data$Year))
colnames(tbl)<-c("Sex","Year","Total")
ggplot(tbl,aes(x=Year,y=Total,fill=Sex))+geom_bar(stat="identity")

複雑なグラフの作成

ggplotの結果もオブジェクトに格納することができます.オブジェクトに格納することで,グラフを調整しながら作ることができます.

#クロス集計
table(data$County,data$Sex) 
##              
##                  F    M
##   ALBANY       319  495
##   ALLEGANY       9   25
##   BRONX       1120 1273
##   BROOME       201  371
##   CATTARAUGUS   52  118
##   CAYUGA        44  101
##   CHAUTAUQUA   109  228
##   CHEMUNG       49  131
##   CHENANGO      17   23
##   CLINTON       44   78
##   COLUMBIA      12   32
##   CORTLAND      15   15
##   DELAWARE       5   17
##   DUTCHESS     310  519
##   ERIE        1278 1279
##   ESSEX          5    4
##   FRANKLIN       9   31
##   FULTON        19   39
##   GENESEE       31   50
##   GREENE        10   16
##   HERKIMER      34   64
##   JEFFERSON    223  396
##   KINGS       2517 2440
##   LEWIS          2    6
##   LIVINGSTON    23   37
##   MADISON       33   78
##   MONROE      1097 1169
##   MONTGOMERY    13   40
##   NASSAU      1907 1641
##   NEW YORK    1228 1234
##   NIAGARA      272  412
##   ONEIDA       283  430
##   ONONDAGA     660  787
##   ONTARIO       85  162
##   ORANGE       706  852
##   ORLEANS        8   11
##   OSWEGO       117  254
##   OTSEGO        11   24
##   PUTNAM        81  145
##   QUEENS      1733 1643
##   RENSSELAER   165  320
##   RICHMOND     275  407
##   ROCKLAND     640  809
##   SARATOGA     294  453
##   SCHENECTADY  173  327
##   SCHOHARIE      3   10
##   SCHUYLER       0    1
##   SENECA         8   12
##   ST LAWRENCE  100  185
##   STEUBEN       76  155
##   SUFFOLK     2164 1841
##   SULLIVAN      35   85
##   TIOGA         14   19
##   TOMPKINS      36   80
##   ULSTER       162  305
##   WARREN        29   66
##   WASHINGTON    24   60
##   WAYNE         82  152
##   WESTCHESTER 1531 1410
##   WYOMING        7   11
##   YATES          0    3
#クロス集計結果をデータフレームに変換
tbl <- data.frame(table(data$County,data$Sex))
#列名の設定
names(tbl) <- c("County","Sex","Total")
#グラフ作成(x軸は郡,y軸は集計数,塗色は性別毎,x軸ラベルは縦)
g <- ggplot(tbl,aes(x=County,y=Total,fill=Sex))+geom_bar(stat="identity")
#グラフ描画
g

X軸ラベルを回転させます.

#X軸ラベル回転
g <- g+theme(axis.text.x = element_text(angle = 90, hjust = 1))
#グラフ描画
g

グラフタイトルをつけます.

#グラフタイトル
g <- g+ggtitle("number of children in countries")
g

ちょっと複雑なグラフの作成

名前ランキングトップ10

  1. データをFirstName別に集計します.
#クロス集計
tbl <- table(data$First.Name)
  1. 集計結果を降順に並び替えて上位10件を表示します.
#上位10位の表示
sort(tbl,decreasing=TRUE)[1:10]
## 
##     EMMA    JACOB    LOGAN   OLIVIA ISABELLA   SOPHIA     NOAH    MASON 
##      284      284      270      268      259      249      247      245 
##    ETHAN      AVA 
##      239      234
  1. 上位10件をデータフレーム化します.
dat<-data.frame(sort(tbl,decreasing=TRUE)[1:10])
colnames(dat)<-c("total")
  1. 行ラベル(名前)をもとに新しい列を作ります.
dat$name<-rownames(dat)
dat
##          total     name
## EMMA       284     EMMA
## JACOB      284    JACOB
## LOGAN      270    LOGAN
## OLIVIA     268   OLIVIA
## ISABELLA   259 ISABELLA
## SOPHIA     249   SOPHIA
## NOAH       247     NOAH
## MASON      245    MASON
## ETHAN      239    ETHAN
## AVA        234      AVA
  1. 棒グラフを描画します.
g<-ggplot(dat,aes(x=name,y=total))+geom_bar(stat="identity")
g

  1. 棒グラフの順番を変更します.人気順(昇順)に並び替えます.
#人気順(昇順)に並び替える
g<-ggplot(dat,aes(x=reorder(name,total),y=total))+geom_bar(stat="identity")
g

X軸ラベルが変更されてしまったので直します.

g + labs(x="name")

  1. 棒グラフの順番を変更します.人気順(降順)に並び替えます.
#人気順(降順)に並び替える
g<-ggplot(dat,aes(x=reorder(name,-total),y=total))+geom_bar(stat="identity")+labs(x="name")
g

人気名の推移

前述の人気名の人気推移を見てみます.

  1. 名前(First.Name)と調査年度(Year)でクロス集計を行う.
tbl <- data.frame(table(data$First.Name,data$Year))
colnames(tbl)<-c("name","year","count")
  1. 特定の名前のデータだけ取り出します.(上位10位の名前のみ)
#d <- tbl[tbl$name %in% c("EMMA","JACOB","LOGAN","OLIVIA","ISABELLA","SOPHIA","NOAH","MASON","ETHAN","AVA"),]
d <- tbl[tbl$name %in% dat$name,]
  1. グラフを書きます.
g<-ggplot(d,aes(x=year,y=count,group=name,colour=name,shape=name))+geom_line()
g

g<-g+geom_point()+scale_shape_manual(values = 1:10)
g

人気名トップ10の推移

tbl <- data.frame(table(data$First.Name,data$Year))
colnames(tbl)<-c("name","year","count")

tmp <- tbl[tbl$year==2007,]
d <- tmp[order(tmp$count,decreasing = TRUE),][1:10,]
tmp <- tbl[tbl$year==2008,]
d<-rbind(d,tmp[order(tmp$count,decreasing = TRUE),][1:10,])
tmp <- tbl[tbl$year==2009,]
d<-rbind(d,tmp[order(tmp$count,decreasing = TRUE),][1:10,])
tmp <- tbl[tbl$year==2010,]
d<-rbind(d,tmp[order(tmp$count,decreasing = TRUE),][1:10,])
tmp <- tbl[tbl$year==2011,]
d<-rbind(d,tmp[order(tmp$count,decreasing = TRUE),][1:10,])
tmp <- tbl[tbl$year==2012,]
d<-rbind(d,tmp[order(tmp$count,decreasing = TRUE),][1:10,])
tmp <- tbl[tbl$year==2013,]
d<-rbind(d,tmp[order(tmp$count,decreasing = TRUE),][1:10,])

g<-ggplot(d,aes(x=year,y=count,group=name,colour=name))+geom_line()
g<-g+geom_point(aes(shape=name))+scale_shape_manual(values = seq(from=1,to=length(unique(d$name))))
g

2012年男女兼用名の集計

2012年度のデータから,男女ともに用いられる名前,男女兼用名を集計します.

  1. 2012年度のデータを取り出します.
#2012年データの抽出
sub <- subset(data,Year==2012)
  1. 前述のデータを男女別に分けます.
#男性データの抽出
male <- sub[sub$Sex=="M",]
#女性データの抽出
female <- sub[sub$Sex=="F",]
#データの要約
summary(male)
##       Year          First.Name           County     Sex     
##  Min.   :2012   MASON    :  45   KINGS      : 359   F:   0  
##  1st Qu.:2012   LIAM     :  43   SUFFOLK    : 261   M:3292  
##  Median :2012   JACOB    :  37   QUEENS     : 241           
##  Mean   :2012   NOAH     :  37   NASSAU     : 237           
##  3rd Qu.:2012   ALEXANDER:  33   WESTCHESTER: 194           
##  Max.   :2012   JACKSON  :  33   ERIE       : 193           
##                 (Other)  :3064   (Other)    :1807           
##      Count      
##  Min.   :  5.0  
##  1st Qu.:  7.0  
##  Median : 11.0  
##  Mean   : 20.2  
##  3rd Qu.: 21.0  
##  Max.   :273.0  
## 
summary(female)
##       Year         First.Name           County     Sex     
##  Min.   :2012   SOPHIA  :  44   KINGS      : 384   F:2872  
##  1st Qu.:2012   EMMA    :  42   SUFFOLK    : 300   M:   0  
##  Median :2012   OLIVIA  :  37   NASSAU     : 270           
##  Mean   :2012   ISABELLA:  35   QUEENS     : 244           
##  3rd Qu.:2012   AVA     :  30   WESTCHESTER: 226           
##  Max.   :2012   ABIGAIL :  29   ERIE       : 186           
##                 (Other) :2655   (Other)    :1262           
##      Count       
##  Min.   :  5.00  
##  1st Qu.:  6.00  
##  Median : 11.00  
##  Mean   : 16.55  
##  3rd Qu.: 18.00  
##  Max.   :204.00  
## 
  1. 男女別に名前をキーにしたCount列の合計を計算します.
#名前をキーにCount列集計
m <- aggregate(male$Count,list(male$First.Name),sum)
names(m) <- c("name","cnt")
#名前をキーにCount列集計
f <- aggregate(female$Count,list(female$First.Name),sum)
names(f) <- c("name","cnt")
#データ確認(先頭3行だけ表示)
head(m[order(m$cnt,decreasing=TRUE),],n=3)
##        name  cnt
## 367 MICHAEL 1317
## 230   JACOB 1289
## 251  JAYDEN 1211
head(f[order(f$cnt,decreasing=TRUE),],n=3)
##         name  cnt
## 547   SOPHIA 1353
## 268 ISABELLA 1223
## 197     EMMA 1165
  1. 男女別のデータで名前が一致する(=男女兼用名)のデータを結合します.
#名前が一致する(=男女兼用名)データのみ結合
tmp <- merge(m,f,by="name")
names(tmp) <- c("name","male","female")
#男性への命名数が多い順に並び替え
tmp[order(tmp$male,decreasing=TRUE),]
##       name male female
## 9    DYLAN  816     18
## 3    ANGEL  361     14
## 12  JORDAN  329     25
## 7  CAMERON  317      7
## 6    BLAKE  209      6
## 1   ALEXIS   70    119
## 16   RILEY   70    227
## 5    AVERY   46    302
## 4    ARIEL   44     75
## 2    AMARI   38      5
## 11  HAYDEN   29     14
## 18  TENZIN   29     25
## 13  PEYTON   26    128
## 10 EMERSON   13     12
## 14 PHOENIX   12     10
## 15   QUINN   10     43
## 8    CASEY    6     14
## 17  SKYLER    5      6
  1. ggplot用のデータフレームを作成します.
#パッケージの読み込み(データフレーム再構成用)
library(reshape2)
#男性への命名数が多い順に並び替え
tbl <- tmp[order(tmp$male,decreasing=TRUE),]
#名前をキーにデータ再構成
tbl <- melt(tbl,id="name")
#確認
head(tbl)
##      name variable value
## 1   DYLAN     male   816
## 2   ANGEL     male   361
## 3  JORDAN     male   329
## 4 CAMERON     male   317
## 5   BLAKE     male   209
## 6  ALEXIS     male    70
  1. 横棒グラフを描画します.
#列名の確認
names(tbl)
## [1] "name"     "variable" "value"
#横棒グラフの描画
g <- ggplot(tbl,aes(x=reorder(name,value),y=value,fill=variable))
g <- g +geom_bar(stat="identity")+coord_flip()
g <- g+labs(x="Unisex name")+ggtitle("Unisex names in 2012")
g

  1. グラフをファイル保存します.
#グラフ画像の保存
ggsave(filename="tmp.png",plot=g)
## Saving 7 x 5 in image
#保存場所の確認
getwd()
## [1] "/Users/mhaya/Documents/kougi/adv_h28"

課題

「Baby Names: Beginning 2007」を用いて以下の条件のグラフを作成し,画像ファイルとして提出してください.グラフタイトルには自身の学籍番号を含めてください.

「2013年度の名前ランキングトップ10がわかるグラフ」

回答イメージ

「2007年度男女兼用名ランキングのグラフ.男女の割合もわかるようにする」

回答イメージ

戻る


クリエイティブ・コモンズ・ライセンス
Masaharu Hayashi を著作者とするこの 作品 は クリエイティブ・コモンズの 表示 4.0 国際 ライセンスで提供されています。